如果你沒有要自製 Subscriber 的需求, 其實 Combine 已經完整的封裝了, 不需要額外理解特殊的處理.
以下翻譯自 Combine documentation protocol Subscriber
Combine 提供 Publisher 具備 Subscribers 的 Operator: `sink()` 與 `assign(to:on:)`
1. sink(receiveCompletion:receiveValue:) 會在 Subscriber 接收到 新的事件與事件終止時, 分別執行 相對應的閉包.
2. assign(to:on:) 會直接將事件值寫入一個 Referance type 的屬性, 透過 keypath 的方式, 直接綁定了事件.
要特別注意的是, 以上這兩個都必須在 Failure 是 Never 的時候, 才可以使用. 使用assign(to:on:)
可以直接避免 retain cycle.
雖然 Subscriber 感覺好像是 必須相依與 Publisher 的, 但是事實上是 Publisher 將事件源頭確立之後, 提供了一個建立 Subscriber 的工廠接口, 而這些接口都會回傳一個 AnyCancellable
的參考型別, 依照 AnyCancellable
文件, 其代表的是 cancellation token
作為取消事件流的途徑, 而由於 ARC 的記憶體管理, 這個 Token
若是沒有保持 ARC 的計數時, 將會在 function Scope 結束後自動解除訂閱.
因此, 在 AnyCancellable
只有 3 個 API 可以使用:
AnyCancellable.cancel()
AnyCancellable.store<C>(in: inout C) where C : RangeReplaceableCollection, C.Element == AnyCancellable
AnyCancellable.store(in: inout Set<AnyCancellable>)
簡單測驗:
IntNeverSubscriber
類別whoami:
我是游諭, ytyubox